import type { FunctionArgs } from '@vueuse/core'

export const hasClass = (ele: RefType<any>, cls: string): any => {
    return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
}

export const addClass = (ele: RefType<any>, cls: string, extracls?: string): any => {
    if (!hasClass(ele, cls)) ele.className += ' ' + cls
    if (extracls) {
        if (!hasClass(ele, extracls)) ele.className += ' ' + extracls
    }
}

export const removeClass = (ele: RefType<any>, cls: string, extracls?: string): any => {
    if (hasClass(ele, cls)) {
        const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
        ele.className = ele.className.replace(reg, ' ').trim()
    }
    if (extracls) {
        if (hasClass(ele, extracls)) {
            const regs = new RegExp('(\\s|^)' + extracls + '(\\s|$)')
            ele.className = ele.className.replace(regs, ' ').trim()
        }
    }
}

export const toggleClass = (flag: boolean, clsName: string, target?: RefType<any>): any => {
    const targetEl = target || document.body
    let { className } = targetEl
    className = className.replace(clsName, '')
    targetEl.className = flag ? `${className} ${clsName} ` : className
}

export function useRafThrottle<T extends FunctionArgs>(fn: T): T {
    let locked = false
    // @ts-ignore
    return function (...args) {
        if (locked) return
        locked = true
        window.requestAnimationFrame(() => {
            fn.apply(this, args)
            locked = false
        })
    }
}
